iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

30天開啟.NET後端工程師的旅程系列 第 13

Day 13 關鍵字 - return , params

  • 分享至 

  • xImage
  •  

前言

在前面10幾天不時會看到void的出現,但確切這是甚麼,並沒有詳細去解釋,這裡就好好說明。


當一個方法(Method)的返回類型(Return Type)被宣告為 void,這表示該方法不會返回任何值。在這樣的方法中,如果需要提前終止方法的執行,可以使用 return 關鍵字。

return 用於中止方法的執行並返回到方法的調用點。

以下是一個使用 return關鍵字提前終止返回類型為 void 的方法的範例:

public class Program
	{
		static void Main(string[] args)
		{
			var calculator = new Calculator();

			// 正常情況
			calculator.PrintGrade(85); // 輸出:Grade: B

			// 處理錯誤情況
			calculator.PrintGrade(-10); // 輸出:Invalid score
		}
	}
	public class Calculator
	{
		public void PrintGrade(int score)
		{
			// 檢查分數是否在有效範圍內
			if (score < 0 || score > 100)
			{
				Console.WriteLine("Invalid score");
				return; // 使用 return 關鍵字中止方法執行
			}

			// 根據分數計算等級
			char grade;
			if (score >= 90)
				grade = 'A';
			else if (score >= 80)
				grade = 'B';
			else if (score >= 70)
				grade = 'C';
			else if (score >= 60)
				grade = 'D';
			else
				grade = 'F';

			Console.WriteLine("Grade: " + grade);
		}
	}

這個例子中,我們有一個 Calculator 類別,其中包含了 PrintGrade 方法,這個方法根據給定的分數計算等級,然後把結果輸出呈現如下圖所示。
當然程式首先要做驗證,檢查分數是否在有效範圍內(0 到 100 之間)。
如果分數不在有效範圍內,就使用 Console.WriteLine 輸出 "Invalid score",接著立即使用 return 關鍵字中止方法執行。
可以看到下圖如果分數無效,就不會繼續執行計算等級的部分,提前結束方法顯示Invalid score。
https://ithelp.ithome.com.tw/upload/images/20230925/20151470QjuQmSRU3X.png

當設計和閱讀程式碼時,關於是否使用單一 return 的規則有一些相關的考量。

單一 return 的優點在於它可以簡化程式碼的流程控制。
當只有一個 return 時,閱讀程式碼的人可以快速找到函數的返回點,不需要跟蹤多個可能的 return 語句,而這種使用單一入口/單一出口的控制敘述式,類似於結構化程式設計中的理念,有助於提高程式碼的可讀性。
此外,單一 return 可以幫助減少程式碼的錯誤機會,因為開發者只需要關注一個返回點,降低了錯誤發生的可能性。

然而,有些情況下,使用多個 return 可能更直觀和易於理解。
特別是當函數的邏輯分支很多時,每個分支都有自己的返回點,使用多個 return 可以讓程式碼更清晰。

最重要的是,選擇使用單一還是多個 return 應該視情況而定。關鍵是保持程式碼的一致性、可讀性和可維護性,只要確保程式碼易於理解並且能夠正確運作即可。

換方式解釋

當我們寫程式,就像在玩一個故事遊戲一樣。每個故事(或程式)都有一個開始和一個結束,就像遊戲中的關卡一樣。我們必須按照順序完成每個故事或關卡,從第一個開始,然後才能到達最後一個。

這就是結構化程式設計的概念。它告訴我們要將一個大的程式分成許多小的部分,每個部分都有一個入口(開始)和一個出口(結束),我們按照順序執行這些部分,就像通過遊戲中的不同關卡一樣。

但有時候,我們可能需要在故事中添加一些彩蛋或變化,就像在遊戲中突然出現了新的挑戰。這就是多個 return 的情況。可以使程式碼更有趣,更具變化性,但也需要更謹慎地設計,以確保程式碼保持清晰且易於理解。

總之,結構化程式設計就像玩故事遊戲一樣,按照順序完成每個故事或關卡,確保程式碼有清晰的流程,同時也能在需要時添加一些有趣的變化。

params 關鍵字

當你需要一個方法來執行某種操作,但希望該方法具有彈性,可以處理不同數量的輸入時,可以使用 C# 中的 params 關鍵字。這個技巧讓你可以設計方法,接受可變數量的參數,而不必提前知道有多少參數。

以下是一個使用 params 關鍵字的示例:

class Program
{
    static void Main(string[] args)
    {
        var helper = new Calculator();

        int sum1 = helper.Add(1, 3);
        int sum2 = helper.Add(2, 5, 8);

        Console.WriteLine("Sum 1: " + sum1);
        Console.WriteLine("Sum 2: " + sum2);

        int sum3 = helper.Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Console.WriteLine("Sum 3: " + sum3);
    }
}

public class Calculator
{
    public int Add(params int[] numbers)
    {
        int sum = 0;
        foreach (int number in numbers)
        {
            sum += number;
        }
        return sum;
    }
}

詳細解釋上面這段程式碼,

  1. 在 Main 方法中,首先創建new了一個 Calculator 的實例,稱為 helper 。這是用來呼叫 Calculator 類別中的方法的物件。
  2. 我們使用 helper 物件呼叫這個物件裡面的 Add 方法三次,每次傳入不同數量的整數參數:
    • 第一次:helper.Add(1, 3); 傳入兩個整數。
    • 第二次:helper.Add(2, 5, 8); 傳入三個整數。
    • 第三次:helper.Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 傳入十個整數。
  3. 再看到下面 Calculator 的class中,裡面定義了一個 Add 方法,這個方法裡面我們使用 params 的關鍵字來接受一個整數陣列number ,表示 Add 的方法可以接受可變數量的整數參數,而不需要提前知道有多少個參數。
  4. 在 Add 方法內部,我們初始化了一個整數變數 sum ,用於存儲計算結果的總和。
  5. 使用 foreach 迴圈遍歷 numbers 陣列中的每個整數(這裡就用到前面提到的foreach迴圈),一個個加到 sum 變數中。
  6. 最後,我們回傳 sum 變數的值,這也就是所有傳入參數的總和,所以我們在Main 方法裡面只要每次呼叫Add方法,把這個結果放在不同的整數變數中(也就是sum1 、 sum2 、 sum3),最後就可以看到輸出的結果如下圖了。
    https://ithelp.ithome.com.tw/upload/images/20230925/20151470eFNqlCPfWh.png

在上面的舉例可以看到,Calculator 類別的 Add 方法使用了 params 關鍵字來接受一個 int 類型的可變參數列表 numbers。在 Main 方法中,我們可以呼叫 Add 方法,並傳入不同數量的整數參數,方法會將它們加總並返回結果。

使用 params關鍵字的好處是它讓你的方法更具靈活性,可以應對不同的情況,而不需要為每種情況都創建一個不同數量參數的方法。這樣的設計可以提高代碼的可重用性和簡潔性。


Day 13挑戰完成~~


上一篇
Day 12 單一職責原則 (Single Responsibility Principle)
下一篇
Day 14 抽象 虛擬
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言